home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_084 / ed / docmd.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  267 lines

  1. /*
  2.  * Copyright 1987 Brian Beattie Rights Reserved.
  3.  *
  4.  * Permission to copy and/or distribute granted under the
  5.  * following conditions:
  6.  *
  7.  * 1). No charge may be made other than resonable charges
  8.  *    for reproduction.
  9.  *
  10.  * 2). This notice must remain intact.
  11.  *
  12.  * 3). No further restrictions may be added.
  13.  *
  14.  */
  15. #include <stdio.h>
  16. #include "tools.h"
  17. #include "ed.h"
  18.  
  19. char    fname[MAXFNAME];
  20. int    fchanged;
  21.  
  22. docmd(glob)
  23. int    glob;
  24. {
  25.     static char    rhs[MAXPAT];
  26.     static TOKEN    *subpat;
  27.     int    c, err, line3;
  28.     int    i, apflg, pflag, gflag;
  29.     int    nchng;
  30.     char    *fptr;
  31.  
  32.     pflag = FALSE;
  33.     while(*inptr == SP && *inptr == HT)
  34.         inptr++;
  35.  
  36.     c = *inptr++;
  37.  
  38.     switch(c)
  39.     {
  40.     case NL:
  41.         if(nlines == 0)
  42.         {
  43.             line2 = nextln(curln);
  44.         }
  45.         curln = line2;
  46.         return (1);
  47.         break;
  48.  
  49.     case '=':
  50.         printf("%6d=\n",line2);
  51.         break;
  52.  
  53.     case 'A':    
  54.     case 'a':
  55.         if(*inptr != NL || nlines > 1)
  56.             return(ERR);
  57.  
  58.         if(append(line1, glob) < 0)
  59.             return(ERR);;
  60.         fchanged = TRUE;
  61.         break;
  62.  
  63.     case 'C':
  64.     case 'c':
  65.         if(*inptr != NL)
  66.             return(ERR);
  67.  
  68.         if(deflt(curln, curln) < 0)
  69.             return(ERR);
  70.  
  71.         if(del(line1, line2) < 0)
  72.             return(ERR);
  73.         if(append(curln, glob) < 0)
  74.             return(ERR);
  75.         fchanged = TRUE;
  76.         break;
  77.  
  78.     case 'D':
  79.     case 'd':
  80.         if(*inptr != NL)
  81.             return(ERR);
  82.  
  83.         if(deflt(curln, curln) < 0)
  84.             return(ERR);
  85.  
  86.         if(del(line1, line2) < 0)
  87.             return(ERR);
  88.         if(nextln(curln) != 0)
  89.             curln = nextln(curln);
  90.         fchanged = TRUE;
  91.         break;
  92.  
  93.     case 'E':
  94.     case 'e':
  95.         if(nlines > 0)
  96.             return(ERR);
  97.         if(fchanged && *inptr != '!')
  98.         {
  99.             printf("File not saved\n");
  100.             return(ERR);
  101.         }
  102.         if(*inptr == '!')
  103.             inptr++;
  104.  
  105.         if(*inptr != ' ' && *inptr != HT && *inptr != NL)
  106.             return(ERR);
  107.  
  108.         if((fptr = getfn()) == NULL)
  109.             return(ERR);
  110.  
  111.         clrbuf();
  112.         if((err = doread(0, fptr)) < 0)
  113.             return(err);
  114.  
  115.         strcpy(fname, fptr);
  116.         fchanged = FALSE;
  117.         break;
  118.  
  119.     case 'I':
  120.     case 'i':
  121.         if(*inptr != NL || nlines > 1)
  122.             return(ERR);
  123.  
  124.         if(append(prevln(line1), glob) < 0)
  125.             return(ERR);
  126.         fchanged = TRUE;
  127.         break;
  128.  
  129.     case 'M':
  130.     case 'm':
  131.         if((line3 = getone()) < 0)
  132.             return(ERR);
  133.         if(deflt(curln,curln) < 0)
  134.             return(ERR);
  135.         if(move(line3) < 0)
  136.             return(ERR);
  137.         fchanged = TRUE;
  138.         break;
  139.  
  140.     case 'P':
  141.     case 'p':
  142.         if(*inptr != NL)
  143.             return(ERR);
  144.         if(deflt(curln,curln) < 0)
  145.             return(ERR);
  146.         if(doprnt(line1,line2) < 0)
  147.             return(ERR);
  148.         break;
  149.  
  150.     case 'Q':
  151.     case 'q':
  152.         if(fchanged && *inptr != '!')
  153.         {
  154.             printf("File not saved\n");
  155.             return(ERR);
  156.         }
  157.         if(*inptr == '!')
  158.             inptr++;
  159.         if(*inptr == NL && nlines == 0 && !glob)
  160.             return(EOF);
  161.         else
  162.             return(ERR);
  163.  
  164.     case 'R':
  165.     case 'r':
  166.         if(nlines > 1)
  167.             return(ERR);
  168.  
  169.         if(nlines = 0)
  170.             line2 = lastln;
  171.  
  172.         if(*inptr != ' ' && *inptr != HT && *inptr != NL)
  173.             return(ERR);
  174.  
  175.         if((fptr = getfn()) == NULL)
  176.             return(ERR);
  177.  
  178.         if((err = doread(line2, fptr)) < 0)
  179.             return(err);
  180.         fchanged = TRUE;
  181.         break;
  182.  
  183.     case 'S':
  184.     case 's':
  185.         if(toupper(*inptr) == 'E')
  186.             return(set());
  187.         while(*inptr == SP || *inptr == HT)
  188.             inptr++;
  189.         if((subpat = optpat(subpat)) == NULL)
  190.             return(ERR);
  191.         if((gflag = getrhs(rhs)) < 0)
  192.             return(ERR);
  193.         if(toupper(*inptr) == 'P')
  194.             pflag++;
  195.         if(deflt(curln, curln) < 0)
  196.             return(ERR);
  197.         if((nchng = subst(subpat, rhs, gflag, pflag)) < 0)
  198.             return(ERR);
  199.         if(nchng)
  200.             fchanged = TRUE;
  201.         return (1);
  202.  
  203.     case 'W':
  204.     case 'w':
  205.         apflg = 0;
  206.         if(inptr[0] == '>' && inptr[1] == '>')
  207.         {
  208.             apflg++;
  209.             inptr++;
  210.             inptr++;
  211.         }
  212.  
  213.         if(*inptr != ' ' && *inptr != HT && *inptr != NL)
  214.             return(ERR);
  215.  
  216.         if((fptr = getfn()) == NULL)
  217.             return(ERR);
  218.  
  219.         if(deflt(1, lastln) < 0)
  220.             return(ERR);
  221.         if(dowrite(line1, line2, fptr, apflg) < 0)
  222.             return(ERR);
  223.         fchanged = FALSE;
  224.         break;
  225.  
  226.     case 'X':
  227.     case 'x':
  228.         if(*inptr == NL && nlines == 0 && !glob)
  229.         {
  230.             if((fptr = getfn()) == NULL)
  231.                 return(ERR);
  232.             if(dowrite(1, lastln, fptr, 0) >= 0)
  233.                 return(EOF);
  234.         }
  235.         return(ERR);
  236.  
  237.     case 'Z':
  238.     case 'z':
  239.         if(deflt(curln,curln) < 0)
  240.             return(ERR);
  241.  
  242.         switch(*inptr)
  243.         {
  244.         case '-':
  245.             if(doprnt(line1-21,line1) < 0)
  246.                 return(ERR);
  247.             break;
  248.  
  249.         case '.':
  250.             if(doprnt(line1-11,line1+10) < 0)
  251.                 return(ERR);
  252.             break;
  253.  
  254.         case '+':
  255.         case '\n':
  256.             if(doprnt(line1,line1+21) < 0)
  257.                 return(ERR);
  258.             break;
  259.         }
  260.         break;
  261.  
  262.     default:
  263.         return(ERR);
  264.     }
  265.     return (0);
  266. }
  267.